package cliente.so;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import cliente.iu.JFrameSingleton;

import comum.rn.RNDescricaoSalaJogo;
import comum.rn.RNEstatisticas;
import comum.rn.RNInfoSalaJogo;
import comum.rn.RNJogada;
import comum.rn.RNPeca;
import comum.so.SOClienteEntrada;
import comum.so.exception.SalaCheiaException;
import comum.so.exception.SalaComNomeJaExistenteException;
import comum.so.exception.SalaNaoExisteException;
import comum.so.exception.SenhaIncorretaException;

public class SOClienteEntradaImpl extends UnicastRemoteObject implements
		SOClienteEntrada {

	private static final long serialVersionUID = -6013613205269341950L;

	private SOControladoraClienteIU controladoraClienteIU;
	private SOClienteSaida clienteSaida;

	public SOClienteEntradaImpl(SOClienteSaida clienteSaida)
			throws RemoteException {
		this.setClienteSaida(clienteSaida);
	}

	@Override
	public void deslogar() {
		try {
			getClienteSaida().deslogar();
		} catch (RemoteException e) {
			e.printStackTrace();
			SOGeradorPopup.getPopup(SOPopup.CONEXAO_PERDIDA);
		}
		getControladoraClienteIU().abrirTelaLogin();
	}

	@Override
	public List<RNDescricaoSalaJogo> buscarSalasJogo(boolean mostrarCheios,
			boolean mostrarComSenha) throws RemoteException {
		return getClienteSaida()
				.buscarSalasJogo(mostrarCheios, mostrarComSenha);
	}

	@Override
	public void entrarSalaJogo(Long idSalaJogo, String senha)
			throws RemoteException, SalaCheiaException, SalaNaoExisteException,
			SenhaIncorretaException {
		RNInfoSalaJogo infoSalaJogo = getClienteSaida().entrarSalaJogo(
				idSalaJogo, senha);
		getClienteSaida().iniciarSalaJogo(infoSalaJogo,
				JFrameSingleton.getSingleton());
	}

	@Override
	public void criarSalaJogo(String nome, String senha)
			throws RemoteException, SalaComNomeJaExistenteException {
		RNInfoSalaJogo infoSalaJogo = getClienteSaida().criarSalaJogo(nome,
				senha);
		getClienteSaida().iniciarSalaJogo(infoSalaJogo,
				JFrameSingleton.getSingleton());
	}

	@Override
	public RNEstatisticas obterEstatisticas() throws RemoteException {
		return getClienteSaida().obterEstatisticas();
	}

	@Override
	public boolean entrarMesa(int posicaoDesejada, Long idSalaJogo)
			throws RemoteException {
		return getClienteSaida().entrarMesa(posicaoDesejada, idSalaJogo);
	}

	@Override
	public void sairMesa(Long idSalaJogo) throws RemoteException {
		getClienteSaida().sairMesa(idSalaJogo);
	}

	@Override
	public void sairSalaEspera(Long idSalaJogo) throws RemoteException {
		getClienteSaida().sairSalaEspera(idSalaJogo);

	}

	@Override
	public void fazerJogada(Long idSalaJogo, RNJogada jogada)
			throws RemoteException {
		getClienteSaida().fazerJogada(idSalaJogo, jogada);
	}

	@Override
	public void informarSaidaJogador(String jogadorQueSaiu,
			RNInfoSalaJogo infoSalaJogo) throws RemoteException {
		getClienteSaida().informarSaidaJogador(jogadorQueSaiu,
				getControladoraClienteIU(), infoSalaJogo);

	}

	@Override
	public void informarMudancaMesa(Integer[] posicoesMesa)
			throws RemoteException {
		getClienteSaida().informarMudancaMesa(posicoesMesa);

	}

	@Override
	public void informarJogada(String jogadorQueJogou, RNJogada jogada,
			String novoJogadorEmTurno) throws RemoteException {
		getClienteSaida().informarJogada(jogadorQueJogou, jogada,
				novoJogadorEmTurno);
	}

	@Override
	public void informarInicioPartida(List<RNPeca> pecas, String primeiroAJogar)
			throws RemoteException {
		getClienteSaida().informarInicioPartida(pecas, primeiroAJogar);
	}

	@Override
	public void informarFimPartida(String mensagem) throws RemoteException {
		getClienteSaida().informarFimPartida(mensagem,
				getControladoraClienteIU());

	}

	@Override
	public void informarFechamentoServidor() throws RemoteException {
		getControladoraClienteIU().encerrarAplicacao();
	}

	public void setControladoraIU(SOControladoraClienteIU controladoraIU) {
		this.setControladoraClienteIU(controladoraIU);
	}

	@Override
	public void desistirJogo(Long idSalaJogo) throws RemoteException {
		getClienteSaida().desistirJogo(idSalaJogo);

	}

	@Override
	public void iniciarPartida(String identificadorAdministrador,
			Long idSalaJogo) throws RemoteException {
		String identificador = getClienteSaida().getIdentificador();

		if (identificador.equals(identificadorAdministrador)) {
			getClienteSaida().iniciarPartida(identificadorAdministrador,
					idSalaJogo);
		}
	}

	@Override
	public void informarEntradaJogador(String jogadorQueEntrou,
			RNInfoSalaJogo infoSalaJogo) throws RemoteException {
		getClienteSaida()
				.informarEntradaJogador(jogadorQueEntrou, infoSalaJogo);
	}

	@Override
	public void abrirSalaPrincipal() throws RemoteException {
		getClienteSaida().abrirSalaPrincipal(JFrameSingleton.getSingleton());
	}

	@Override
	public String getIdentificador() throws RemoteException {
		return getClienteSaida().getIdentificador();

	}

	protected SOControladoraClienteIU getControladoraClienteIU() {
		return controladoraClienteIU;
	}

	protected void setControladoraClienteIU(
			SOControladoraClienteIU controladoraClienteIU) {
		this.controladoraClienteIU = controladoraClienteIU;
	}

	protected SOClienteSaida getClienteSaida() {
		return clienteSaida;
	}

	protected void setClienteSaida(SOClienteSaida clienteSaida) {
		this.clienteSaida = clienteSaida;
	}

}
